package functional.functioncomposition;

import java.util.function.Predicate;
import java.util.stream.Stream;

/**
 * @ClassName PredicateComposition
 * @PackageName functional.functionComposition
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/8/27 下午2:14
 * @Version 1.0
 */
public class PredicateComposition {

    static Predicate<String>
            p1 = s -> s.contains("bar"),
            p2 = s -> s.length() < 5,
            p3 = s -> s.contains("foo"),
    /**
     * 种组合代码不够直观
     * <p>
     * 种组合代码不够直观
     * 在这些方法中，每个方法都返回了一个新的Predicate对象（可能是组合后的谓词，也可能是逻辑非后的谓词）。
     * 重要的是，返回的对象仍然是一个Predicate，因此可以继续调用Predicate接口中的其他方法。
     */
    p4 = p1.negate().and(p2).or(p3);

    public static void main(String[] args) {
        Stream.of("bar", "foobar", "foobaz", "fongopuckey")
                //.filter(p1.negate())
                .filter(p1.negate().and(p2))
                .forEach(System.out::println);
        System.out.println("=====");
        Stream.of("bar", "foobar", "foobaz", "fongopuckey")
                //.filter(p1.negate())
                .filter(p3)
                .forEach(System.out::println);
    }
}
